(PYTHON) Day - 4 Basic Data Types

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python
  • 파이썬 기본 자료형 - w3schools.com

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다



HackerRank

Numpy 패키지와 관련된 내용은 수학적 내용들과 함께 다루기 위해 나중에 다시 정리하기로 했다.

HackerRank의 Python 연습문제들은 아래와 같은 카테고리로 분류 된다:

Subdomain

  • Introduction
  • Basic Data Types
  • Strings
  • Sets
  • Math
  • Itertools
  • Collections
  • Date and Time
  • Errors and Exceptions
  • Classes
  • Built-Ins
  • Python Functionals
  • Regex and Parsing
  • XML
  • Closures and Decorators
  • Numpy
  • Debugging


Basic Data Types

개념 공부

파이썬의 기본 데이터 타입들에 대해 알아보자

categories python code
Text Type: str
Numeric Types: int, float, complex
Sequence Types: list, tuple, range
Mapping Type: dict
Set Types: set, frozenset
Boolean Type: bool
Binary Types: bytes, bytearray, memoryview
  • type() 함수를 통해 객체의 데이터 타입을 알 수 있다
    x = 5
    print(type(x))
    # output
    # <class 'int'>
  • Python에서는 변수에 값을 할당하면 자동으로 데이터 타입이 결정된다.
Example Data type
x = “Hello World” str
x = 20 int
x = 20.5 float
x = 1j complex
x = [“apple”, “banana”, “cherry”] list
x = (“apple”, “banana”, “cherry”) tuple
x = range(6) range
x = {“name” : “John”, “age” : 36} dict
x = {“apple”, “banana”, “cherry”} set
x = frozenset({“apple”, “banana”, “cherry”}) frozenset
x = True bool
x = b”Hello” bytes
x = bytearray(5) bytearray
x = memoryview(bytes(5)) memoryview

Lists

  • INPUT
    입력받을 커맨드 개수 n을 입력받는다
    n 줄에 거쳐 커맨드를 입력받는다

    1 insert i e: Insert integer at position .
    2 print: Print the list.
    3 remove e: Delete the first occurrence of integer .
    4 append e: Insert integer at the end of the list.
    5 sort: Sort the list.
    6 pop: Pop the last element from the list.
    7 reverse: Reverse the list.

if-else문이나 switch문을 사용하면 되는 간단한 예제
하지만 python에는 switch문이 없기 때문에 dict 자료형으로 정리해서 적용하는 스타일로 코딩

if **name** == '**main**':
N = int(input())

my*list = []
command = {
'insert': my_list.insert,
'print': lambda : print(my_list),
'remove': my_list.remove,
'append': my_list.append,
'sort': my_list.sort,
'pop': my_list.pop,
'reverse': my_list.reverse
}
for * in range(N):
usr_c, \*args = input().split()

command[usr_c](*map(int, args))

@lordmauve 사용자의 말에 따르면,

  • ‘if/else문’ 은 많은 반복성과 유지/보수성이 떨어진다
  • ‘eval()’ 함수를 사용하는 것은 보안과 성능 면에서 모두 떨어진다
  • ‘dict 자료형’ 에 명령어들을 담아서 사용하는 것은 나쁘지 않으나,
    모든 메소드들을 정확히 입력해야하며 약간의 반복성을 띈다
  • 확장성을 위해 ‘getattr()’를 사용하는 것을 권장 (하는데 아직은 잘 이해가 안된다)
    (print() 메소드를 따로 설정하는 것을 봤을 때,
    아마 내장함수 list의 네임스페이스에 명령어들이 이미 포함되어 있어서 그런 것 같다)
mylist = []
for \_ in range(int(input())):
inst = input().split()
if inst[0] == 'print':
print(mylist)
else:
getattr(mylist, inst[0])(\*map(int, inst[1:]))

Tuples

  • tuple 보다는 hash() 함수에 대해 궁금해지는 문제…
  • tuple의 해시 값을 알아내는 문제
    if **name** == '**main**':
    n = int(input())
    integer_list = tuple(map(int, input().split()))

    print(hash(integer_list))

List Comprehensions

  • 직육면체의 크기(차원)를 나타내는 세 정수 (x, y, z)를 입력 받고 비교값 N을 입력받는다
    3차원 공간에서 해당 직육면체 범위 안의 값들 중 임의의 (i, j, k) 좌표를 가져왔을 때,
    i + j + k의 값이 N과 다른 모든 좌표값을 출력하는 문제
    (문제 설명부터 길다…)

    1
    1
    1
    2

    [[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]

    • python의 comprehension은 반복적으로 생성가능한 객체를 생성하는 방법이다
      본 예제에서 사용되는 list 외에도 set, dict, generator expression에서 사용될 수 있다
        if **name** == '**main**':
      x, y, z, n = (int(input()) for \_ in range(4))

      print([[i, j, k] for i in range(0, x+1) for j in range(0, y+1) for k in range(0, z+1) if (i+j+k != n)])

Find the Runner-Up Score

  • Runner up이 2등을 말한다는걸 처음 알게 되었다
    그냥 단순히 1등, 2등, 3등을 first prize, second prize, third prize로만 알고 있었는데
    1등을 grand prize 혹은 winner라고 표현하듯이 2등도 runner up이라는 표현이 있었다
    (3등까지 표현하고 싶다면, 2등을 first runner up 3등을 second runner up 이라고 한다)

  • 몇 명의 주자가 있는지 n으로 입력 받고
    각 주자들의 성적(score)을 배열에 입력 받아 2등의 성적을 출력하는 문제

    5
    2 3 6 6 5

    5

    • 2등만 찾으면 되기 때문에 최대값(1등)을 제거하고 다시 최대값을 찾는 방식으로 접근했다
        if **name** == '**main**':
      n = int(input())
      arr = list(map(int, input().split()))

      winner_score = max(arr)
      runner_up_score = max([runner for runner in arr if runner != winner_score])
      print(runner_up_score)

Nested Lists

  • 물리 수업을 듣는 학생 수 N을 입력 받고, 학생 이름과 성적을 n번 반복하며 입력 받음
    성적이 밑에서 2번째인 학생을 출력하는 문제 (성적이 같은 학생은 알파벳 순으로 출력)
    (nested list를 사용해야 함)

    5
    Harry
    37.21
    Berry
    37.21
    Tina
    37.2
    Akriti
    41
    Harsh
    39

    Berry
    Harry

    • dict 자료형으로 접근하려고 했는데 key, value로 정렬하는 등 아직 익숙하지 못해서 에러가 많이 발생함
      2번째로 낮은 값을 찾는데 set() 집합을 이용하는 것이 좋다는 것을 복습함
      if **name** == '**main**':
      marksheet = []

      for _ in range(0,int(input())):
      marksheet.append([input(), float(input())])

      second_highest = sorted(list(set([marks for name, marks in marksheet])))[1]

      print('\n'.join([a for a,b in sorted(marksheet) if b == second_highest]))

Finding the percentage

  • 학생 수 N을 입력 받고,
    각 학생의 이름과 수학, 물리, 화학 성적을 입력 받는다
    마지막 줄에 입력받은 학생의 이름의 성적의 평균을 출력하는 문제
    (dict 자료형을 꼭 사용하라고 나와있다)

3
Krishna 67 68 69
Arjun 70 98 63
Malika 52 56 60
Malika

56.00

  • 출력을 소수점 2번째 자리까지 지정해 줘야 하는 것을 주의!
    {0:.2f}.format() 복습 복습
    if **name** == '**main**':
    n = int(input())
    student*marks = {}
    for * in range(n):
    name, \*line = input().split()
    scores = list(map(float, line))
    student_marks[name] = scores
    query_name = input()

    target = student_marks[query_name]

    sum = 0
    for num in target:
    sum += float(num)

    print("{0:.2f}".format(sum/len(target)))